import org.junit.jupiter.api.Test;

import java.time.LocalDate;
import java.time.Month;
import java.time.format.TextStyle;
import java.util.Arrays;
import java.util.Locale;

public class MonthDemo {

    /**
     * Month枚举类的所有枚举值。
     */
    @Test
    public void test01(){
        System.out.println(Month.JANUARY); // 输出 JANUARY
        System.out.println(Month.FEBRUARY); // 输出 FEBRUARY
        System.out.println(Month.MARCH); // 输出 MARCH
        System.out.println(Month.APRIL); // 输出 APRIL
        System.out.println(Month.MAY); // 输出 MAY
        System.out.println(Month.JUNE); // 输出 JUNE
        System.out.println(Month.JULY); // 输出 JULY
        System.out.println(Month.AUGUST); // 输出 AUGUST
        System.out.println(Month.SEPTEMBER); // 输出 SEPTEMBER
        System.out.println(Month.OCTOBER); // 输出 OCTOBER
        System.out.println(Month.NOVEMBER); // 输出 NOVEMBER
        System.out.println(Month.DECEMBER); // 输出 DECEMBER
    }
}

class MonthDemo01{

    /**
     * from(TemporalAccessor temporal)
     * 作用：从其他含有月份数据的时间类获取month对象。
     */
    @Test
    public void test01(){
        LocalDate date01 = LocalDate.parse("2023-01-01");
        System.out.println(Month.from(date01)); // 输出 JANUARY
    }

    /**
     * of(int month)
     * 作用：根据给定的数字（1~12）获取枚举值。
     */
    @Test
    public void test02(){
        System.out.println(Month.of(1)); // 输出 JANUARY
        System.out.println(Month.of(6)); // 输出 JUNE
        System.out.println(Month.of(12)); // 输出 DECEMBER
    }

    /**
     * valueOf(String name)
     * 作用：根据给定的字符串获取枚举值。
     */
    @Test
    public void test03(){
        System.out.println(Month.valueOf("JANUARY")); // 输出 JANUARY
        System.out.println(Month.valueOf("JUNE")); // 输出 JUNE
        System.out.println(Month.valueOf("DECEMBER")); // 输出 DECEMBER
    }

    /**
     * values()
     * 作用：获取所有枚举值（有序）
     */
    @Test
    public void test04(){
        Month[] months = Month.values();
        System.out.println(Arrays.toString(months)); // 输出 [JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER]
    }
}

class MonthDemo02{
    /**
     * adjustInto(Temporal temporal)
     * 作用：temporal是其它时间类对象，该方法的作用是将其他时间类对象的月份数据修改成month。
     */
    @Test
    public void test01(){
        LocalDate date01 = LocalDate.parse("2023-01-10");
        Month february = Month.FEBRUARY;
        LocalDate date02 = (LocalDate) february.adjustInto(date01);
        System.out.println(date01); // 输出 2023-01-10
        System.out.println(date02); // 输出 2023-02-10
    }

    /**
     * firstDayOfYear(boolean leapYear)
     * 作用：获取某月的第一天在该年的第几天，leapYear参数用来说明该月份是否在闰年中。
     */
    @Test
    public void test02(){
        System.out.println(Month.JANUARY.firstDayOfYear(false)); // 输出 1
        System.out.println(Month.FEBRUARY.firstDayOfYear(false)); // 输出 32
        System.out.println(Month.SEPTEMBER.firstDayOfYear(false)); // 输出 244
        System.out.println(Month.SEPTEMBER.firstDayOfYear(true)); // 输出 245
    }

    /**
     * firstMonthOfQuarter()
     * 作用：获取月份所在的季度的第一个月份。
     */
    @Test
    public void test03(){
        System.out.println(Month.MARCH.firstMonthOfQuarter()); // 输出 JANUARY
        System.out.println(Month.JUNE.firstMonthOfQuarter()); // 输出 APRIL
        System.out.println(Month.SEPTEMBER.firstMonthOfQuarter()); // 输出 JULY
        System.out.println(Month.DECEMBER.firstMonthOfQuarter()); // 输出 OCTOBER
    }

    /**
     * getDisplayName(TextStyle style, Locale locale)
     * 作用：获取month对象文本表示形式。
     * 参数：
     *  style：文本表示方式。如：FULL显示完整的名称，SHORT显示简写的名称，NARROW显示短的名称。
     *  locale：本地化名称。如：Locale.CHINA显示中文名称，Locale.US显示英文名称。
     */
    @Test
    public void test04(){
        System.out.println(Month.JANUARY.getDisplayName(TextStyle.FULL, Locale.US)); // 输出 January
        System.out.println(Month.JANUARY.getDisplayName(TextStyle.SHORT, Locale.US)); // 输出 Jan
        System.out.println(Month.JANUARY.getDisplayName(TextStyle.NARROW, Locale.US)); // 输出 J

        System.out.println(Month.JANUARY.getDisplayName(TextStyle.FULL, Locale.CHINA)); // 输出 一月
        System.out.println(Month.JANUARY.getDisplayName(TextStyle.SHORT, Locale.CHINA)); // 输出 一月
        System.out.println(Month.JANUARY.getDisplayName(TextStyle.NARROW, Locale.CHINA)); // 输出 1
    }

    /**
     * getValue()
     * 作用：获取月份对应的整数值（1~12）。
     */
    @Test
    public void test05(){
        System.out.println(Month.JANUARY.getValue()); // 输出 1
        System.out.println(Month.FEBRUARY.getValue()); // 输出 2
    }

    /**
     * length(boolean leapYear)
     * 作用：获取本月的天数。
     */
    @Test
    public void test06(){
        System.out.println(Month.JANUARY.length(false)); // 输出 31
        System.out.println(Month.FEBRUARY.length(false)); // 输出 28
        System.out.println(Month.FEBRUARY.length(true)); // 输出 29
    }

    /**
     * maxLength()
     * minLength()
     * 作用：获取月份的最大或最小天数。
     */
    @Test
    public void test07(){
        System.out.println(Month.JANUARY.maxLength()); // 输出 31
        System.out.println(Month.FEBRUARY.maxLength()); // 输出 29

        System.out.println(Month.JANUARY.minLength()); // 输出 31
        System.out.println(Month.FEBRUARY.minLength()); // 输出 28
    }

    /**
     * plus(long months)
     * minus(long months)
     * 作用：加上或减去固定值获取另一个的month对象。
     */
    @Test
    public void test08(){
        System.out.println(Month.JANUARY.plus(1).getValue()); // 输出 2
        System.out.println(Month.JANUARY.plus(12).getValue()); // 输出 1

        System.out.println(Month.OCTOBER.minus(1).getValue()); // 输出 9
        System.out.println(Month.OCTOBER.minus(12).getValue()); // 输出 10
    }
}